#include<bits/stdc++.h>
using namespace std;

void NumberOfCharacters(FILE *file) 
{
    int numberofcharacters=0;
    char ch;
    ch=fgetc(file);
    while(!feof(file))
    {
        numberofcharacters++;
        ch=fgetc(file);
    }
    cout<<"字符数:"<<numberofcharacters<<endl;
    rewind(file);
}

void NumberOfWords(FILE *file) 
{
    int numberofwords=0;
    char ch;
    ch=fgetc(file);
    while(!feof(file))
    {
        if(isalnum(ch))
        {
            while(isalnum(ch)||ch=='-')
            {
                ch=fgetc(file);
            }
            numberofwords++;
        }

        ch=fgetc(file);
    }
    cout<<"单词数:"<<numberofwords<<endl;
    rewind(file);
}

void NumberOfSentences(FILE *file) 
{
    int numberofsentences=0;
    char ch;
    ch=fgetc(file);
    while(!feof(file))
    {
        if(ch=='.'||ch=='!'||ch=='?')
        {
            numberofsentences++;
        }
        ch=fgetc(file);    
    }
    cout<<"句子数:"<<numberofsentences<<endl;
    rewind(file);
}

void Advance(FILE *file)
{
    //
    int CodeLine=0;
    int EmptyLine=0;
    int AnnotaLine=0;
    int i=0;
    int numberofsentences=0;
    char ch,str[100];

    ch=fgetc(file);
    while(!feof(file))
    {
        if(ch=='\n'||ch=='\0')
        {
            numberofsentences++;
        }
        ch=fgetc(file);    
    }
    rewind(file);
    while(!feof(file))
    {
        fgets(str,sizeof(str),file);
        if(str[0]=='\n')
        {
            EmptyLine++;
            continue;
        }
        for(i=0;str[i]!='\n';i++)
        {
            if(str[i]=='{'||str[i]=='}')
            {
                if(str[i+1]=='\n')
                {
                    EmptyLine++;
                    goto ABC;
                }
                else
                {
                    while(str[i+1]==' '||str[i+1]=='\t')
                    {
                        i++;
                        if(str[i+1]=='\n')
                        {
                            EmptyLine++;
                            goto ABC;
                        }
                    }
                }
            }
            else
                while(str[i]==' '||str[i]=='\t')
                {
                    i++;
                    if(str[i]=='\n')
                    {
                        EmptyLine++;
                        goto ABC;
                    }
                    
                }
        }
        for(i=0;str[i]!='\n'&&str[i]!='\0';i++)
        {
            if(str[i]=='/')
            {
                if(str[i+1]=='/')
                {
                    AnnotaLine++;
                    break;
                }
                else
                    break;
            }
            
        }
        ABC:;
    }
    cout<<"空行："<<EmptyLine<<endl;
    cout<<"注释行："<<AnnotaLine<<endl;
    cout<<"代码行："<<numberofsentences-EmptyLine-AnnotaLine+1<<endl;
    rewind(file);
}

int main(int argc, char* argv[])
{
    FILE *file;
    switch(argc)
    {
        case 3:
            file=fopen(argv[2],"r");
            if(strcmp(argv[1],"-c")==0)
            {
                NumberOfCharacters(file);
            }
            else if(strcmp(argv[1],"-w")==0)
            {
                NumberOfWords(file);
            }
            else if(strcmp(argv[1],"-l")==0)
            {
                NumberOfSentences(file);
            }
            else if(strcmp(argv[1],"-a")==0)
            {
                Advance(file);
            }
            break;

        case 6:
            file=fopen(argv[5],"r");
            if((strcmp(argv[1],"-c")==0)&&
               (strcmp(argv[2],"-w")==0)&&
               (strcmp(argv[3],"-l")==0)&&
               (strcmp(argv[4],"-a")==0))
            {
                NumberOfCharacters(file);
                NumberOfWords(file);
                NumberOfSentences(file);
                Advance(file);
            }
            break;

    }
    return 0;
}
